package pe.intix.drawback.model;

import java.util.Date;

import javax.persistence.*;
import javax.validation.constraints.*;

import org.openxava.annotations.*;
import org.openxava.util.*;

import pe.intix.drawback.util.*;

/**
 * @author Jeromy Altuna
 * @author Renato
 */
@Entity
@Views([
	@View(members="""
			Registro Aduana [# 
				idDua, serie, fechaNumeracion;
				fechaIngresoZonaPrimaria, fechaExpiracion; 
				imagenes, hayImagen
			];
			Declaración de Mercancías [#
				mercancia;
				cantidadElementos, unidadMedidaElementos, unidadMedidaPeso;
				pesoNeto, pesoBruto;
				valorFob 
			]; 
			detalleDua; 
			detalleFacturaExportacion;
			detalleDuaDrawback;
			informacionComplementaria"""
	), 
	@View(name = "Simple", members = "idDua, fechaNumeracion; fechaIngresoZonaPrimaria")	
])
@Tabs([
	@Tab(properties="idDua, serie, fechaNumeracion, fechaIngresoZonaPrimaria, fechaExpiracion, valorFob, hayImagen",
		 	baseCondition = "estado = 0"
	), 
	@Tab(name = "procesada", 
			properties = "idDua, serie, fechaNumeracion, fechaIngresoZonaPrimaria, fechaExpiracion, valorFob+, estado", 
		 	baseCondition = "estado = 1 or estado = 2",
			rowStyles=[
				@RowStyle(style = "row-red", property = "estado", value = "reportada")
			] 
	) 
])
@Table(name = "dua")
class Dua extends ConImagenes {

	@Id
	@Column(name = "id_dua", length = 30)
	String idDua
	
	@Required
	@Column(name = "serie", length = 7)
	String serie
	
	@Required
	@Column(name = "fecha_ing_zona_primaria")
	@Temporal(TemporalType.TIMESTAMP)
	Date fechaIngresoZonaPrimaria

	@Required
	@Column(name = "fecha_numeracion")
	@Temporal(TemporalType.TIMESTAMP)
	Date fechaNumeracion

	@Required @Digits(integer = 18, fraction = 6)
	@Column(name = "valor_fob", precision = 18, scale = 6)
	BigDecimal valorFob

	@Digits(integer = 18, fraction = 6)
	@Column(name = "peso_neto", precision = 18, scale = 6)
	BigDecimal pesoNeto

	@Digits(integer = 18, fraction = 6)
	@Column(name = "peso_bruto", precision = 18, scale = 6)
	BigDecimal pesoBruto

	@Column(name = "cantidad_elementos")
	Long cantidadElementos

	@Required
	@DescriptionsList(descriptionProperties="descTablaTipo", 
					  condition="tablaTipo = 'tipo_unid_medida'")
	@JoinColumn(name = "tipo_unid_medida_elementos", referencedColumnName = "id_tipo")
	@ManyToOne(fetch=FetchType.LAZY)
	Tipo unidadMedidaElementos;

	@Required
	@DescriptionsList(descriptionProperties="descTablaTipo", condition="tablaTipo = 'tipo_unid_medida'")
	@JoinColumn(name = "tipo_unid_medida_peso", referencedColumnName = "id_tipo")
	@ManyToOne(fetch=FetchType.LAZY)
	Tipo unidadMedidaPeso;

	@Hidden
	@Column(name = "fecha_operacion")
	@Temporal(TemporalType.TIMESTAMP)
	Date fechaOperacion;

	@Stereotype("MEMO")
	@Column(name = "informacion_complementaria") //length=1000
	String informacionComplementaria
	
	@Column(length=100)
	@Required @DisplaySize(50)
	String mercancia
	
	@Hidden
	Estado estado = Estado.INGRESADA
	public enum Estado{ INGRESADA, PROCESADA, REPORTADA }
	
	@ListProperties("producto.descripcion, cantidad")
	@OneToMany(cascade = CascadeType.ALL, mappedBy = "dua")
	Collection<DetalleDua> detalleDua = new ArrayList<>()

	@ListProperties("""
			comprobanteVenta.serie, 
			comprobanteVenta.numero, comprobanteVenta.cliente.razonSocial, 
			comprobanteVenta.importeTotal"""
	)
	@OneToMany(mappedBy = "dua", cascade = CascadeType.ALL)
	Collection<DetalleDuaFacturaExportacion> detalleFacturaExportacion = new ArrayList<>()
	
	@Condition("\${dua.idDua} = \${this.idDua} AND \${cantidadSalida} <> 0")
	@ListProperties("""
		serie, numero, proveedor.razonSocial, producto.descripcion,
		cantidadSalida""")
	@OneToMany(cascade = CascadeType.ALL, mappedBy = "dua")
	Collection<DetalleDuaDrawback> detalleDuaDrawback = new ArrayList<>()

	@Depends("fechaIngresoZonaPrimaria")
	Date getFechaExpiracion(){
		Date d = Dates.cloneWithoutTime(fechaIngresoZonaPrimaria);
		// TODO 180 días hábiles. ¿Especificar en archivo de propiedades o base de datos?
		Dates.addDays(d, 180)
		return d
	}	
}
